#include "mociones.h"

mociones::mociones()
{
    if(!QSqlDatabase::contains("mociones"))
        QSqlDatabase::addDatabase("QSQLITE","mociones");

    // Crea la base de datos que hace la funcion de BallotList(BL)
    if(!QFile::exists("mociones.db")){
        QString cmd("sqlite3 ");
        cmd.append("mociones").append(".db ");
        cmd.append("'create table mociones(pos INTEGER PRIMARY KEY ASC, num_moc INT, sub_moc BLOB, desc_moc BLOB,tipo_voto INT,opc1_desc BLOB,opc2_desc BLOB,opc3_desc BLOB,opc4_desc BLOB,opc5_desc BLOB,tipo_moc BLOB,voted BLOB);'");
        system(cmd.toAscii().data());
    }
}

mociones::~mociones(){}

void mociones::ing_moc(QStringList *mocion){
// Crea la conexion
    QSqlDatabase moc = QSqlDatabase::database("mociones",false);
    moc.setDatabaseName("mociones.db");
    moc.open();

// Crea el modelo
    QSqlTableModel moc_model(0,moc);
    moc_model.setTable("mociones");
    moc_model.setEditStrategy(QSqlTableModel::OnManualSubmit);

    if(mocion->at(2)=="")
        moc_model.setFilter(QString("num_moc=").append(mocion->at(1)));
    else
        moc_model.setFilter(QString("num_moc=").append(mocion->at(1)).append(" and sub_moc='").append(mocion->at(2)).append("'"));
    moc_model.select();

    if(moc_model.rowCount()==0){
        moc_model.insertRows(0, 1);
        moc_model.setData(moc_model.index(0, moc_model.fieldIndex("num_moc")), mocion->at(1));
    }

    moc_model.setData(moc_model.index(0, moc_model.fieldIndex("tipo_moc")), mocion->at(0));
    moc_model.setData(moc_model.index(0, moc_model.fieldIndex("desc_moc")), mocion->at(3));
    moc_model.setData(moc_model.index(0, moc_model.fieldIndex("tipo_voto")), mocion->at(4));
    moc_model.setData(moc_model.index(0, moc_model.fieldIndex("opc1_desc")), mocion->at(5));
    moc_model.setData(moc_model.index(0, moc_model.fieldIndex("opc2_desc")), mocion->at(6));
    moc_model.setData(moc_model.index(0, moc_model.fieldIndex("opc3_desc")), mocion->at(7));
    moc_model.setData(moc_model.index(0, moc_model.fieldIndex("opc4_desc")), mocion->at(8));
    moc_model.setData(moc_model.index(0, moc_model.fieldIndex("opc5_desc")), mocion->at(9));
    moc_model.setData(moc_model.index(0, moc_model.fieldIndex("voted")), "no");
    moc_model.submitAll();
}

void mociones::del_moc(QString desc_moc){
    QString num_moc,sub_moc;
    int num_size,sub_size;

    desc_moc.remove(0,7);

    num_size = desc_moc.indexOf("-");
    sub_size = desc_moc.indexOf(":");

    if(num_size==-1 || num_size>sub_size){
        for(int j=0;j<sub_size; j++){
            num_moc.append(desc_moc.at(j));
        }
    }
    else if(num_size<sub_size){
            for(int j=0;j<num_size; j++){
                num_moc.append(desc_moc.at(j));
            }
            desc_moc.remove(0,num_size+1);
            sub_size = desc_moc.indexOf(":");
            for(int g=0;g<sub_size; g++){
                sub_moc.append(desc_moc.at(g));
            }
    }

// Crea la conexion
    QSqlDatabase moc = QSqlDatabase::database("mociones",false);
    moc.setDatabaseName("mociones.db");
    if(!moc.open()){
        return;
    }

// Crea el modelo
    QSqlTableModel moc_model(0,moc);
    moc_model.setTable("mociones");
    moc_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    if(sub_moc.isEmpty())
        moc_model.setFilter(QString("num_moc=").append(num_moc));
    else
        moc_model.setFilter(QString("num_moc= ").append(num_moc).append(" and sub_moc='").append(sub_moc).append("'"));
    moc_model.select();

    if(moc_model.rowCount() > 0) {
        moc_model.removeRows(0, moc_model.rowCount());
        moc_model.submitAll();
    }
    return;
}

bool mociones::fusion_moc(){
return false;
}

void mociones::mocion(QString num_moc, QStringList &mocion){
// Crea la conexion
    QSqlDatabase moc = QSqlDatabase::database("mociones",false);
    moc.setDatabaseName("mociones.db");
    moc.open();

// Crea el modelo
    QSqlTableModel moc_model(0,moc);
    moc_model.setTable("mociones");
    moc_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    moc_model.setFilter(QString("num_moc='").append(num_moc).append("'"));
//    VKLmodel.setFilter(QString("ev='").append(VLmodel.record(i).value("ev").toString()).append("'"));
    moc_model.select();

    if(moc_model.rowCount()==0){
        return;}
    mocion << moc_model.record(0).value("sub_moc").toString();
    mocion << moc_model.record(0).value("desc_moc").toString();
    mocion << moc_model.record(0).value("tipo_voto").toString();
    mocion << moc_model.record(0).value("opc1_desc").toString();
    mocion << moc_model.record(0).value("opc2_desc").toString();
    mocion << moc_model.record(0).value("opc3_desc").toString();
    mocion << moc_model.record(0).value("opc4_desc").toString();
    mocion << moc_model.record(0).value("opc5_desc").toString();
    mocion << moc_model.record(0).value("tipo_moc").toString();
}

void mociones::get_moc(QStringList &mociones,QString filter){
// Crea la conexion
    QSqlDatabase moc = QSqlDatabase::database("mociones",false);
    moc.setDatabaseName("mociones.db");
    if(!moc.open()){
        return;
    }

// Crea el modelo
    QSqlTableModel moc_model(0,moc);
    moc_model.setTable("mociones");
    moc_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    moc_model.setSort(moc_model.fieldIndex("num_moc"),Qt::AscendingOrder);
    moc_model.setFilter(filter);
    moc_model.select();

    for(int i=0;i<moc_model.rowCount();i++){
        QString buffer("Mocion ");
        if(moc_model.record(i).value("sub_moc").toString().isEmpty()){
            buffer.append(moc_model.record(i).value("num_moc").toString());
            buffer.append(": ").append(moc_model.record(i).value("desc_moc").toString());
        }
        else{
            buffer.append(moc_model.record(i).value("num_moc").toString());
            buffer.append("-").append(moc_model.record(i).value("sub_moc").toString()).append(": ");
            buffer.append(moc_model.record(i).value("desc_moc").toString());
        }
        mociones << buffer;
    }
}

bool mociones::search_moc(QString num_moc){
// Crea la conexion
    QSqlDatabase moc = QSqlDatabase::database("mociones",false);
    moc.setDatabaseName("mociones.db");
    if(!moc.open()){
        return false;
    }

// Crea el modelo
    QSqlTableModel moc_model(0,moc);
    moc_model.setTable("mociones");
    moc_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    moc_model.setFilter(QString("num_moc='").append(num_moc).append("'"));
    moc_model.select();

    if(moc_model.rowCount()==0){
        return false;}
    return true;
}

void mociones::div_moc(QString desc_moc,int num_div){
// Manipulacion del string desc_prop para separar el numero de propuesta
    QString letras("abcdefghijklmnopqrstuvwxyz");
    QString num_moc,sub_moc;
    int num_size,sub_size;

    desc_moc.remove(0,7);

    num_size = desc_moc.indexOf("-");
    sub_size = desc_moc.indexOf(":");

    if(num_size==-1 || num_size>sub_size){
        for(int j=0;j<sub_size; j++){
            num_moc.append(desc_moc.at(j));
        }
    }
    else if(num_size<sub_size){
            for(int j=0;j<num_size; j++){
                num_moc.append(desc_moc.at(j));
            }
            desc_moc.remove(0,num_size+1);
            sub_size = desc_moc.indexOf(":");
            for(int g=0;g<sub_size; g++){
                sub_moc.append(desc_moc.at(g));
            }
    }

// Crea la conexion
    QSqlDatabase moc = QSqlDatabase::database("mociones",false);
    moc.setDatabaseName("mociones.db");
    if(!moc.open()){
        return;
    }

// Crea el modelo
    QSqlTableModel moc_model(0,moc);
    moc_model.setTable("mociones");
    moc_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    if(sub_moc.isEmpty())
        moc_model.setFilter(QString("num_moc=").append(num_moc));
    else
        moc_model.setFilter(QString("num_moc= ").append(num_moc).append(" and sub_moc='").append(sub_moc).append("'"));

    moc_model.select();

    QSqlRecord buffer(moc_model.record(0));
    buffer.remove(moc_model.fieldIndex("pos"));

    moc_model.removeRows(0,1);
    moc_model.submitAll();

    for(int i=0;i<num_div;i++){
        moc_model.insertRow(0);
        moc_model.setRecord(0,buffer);
        if(buffer.value("sub_prop").toString().isEmpty())
            moc_model.setData(moc_model.index(0, moc_model.fieldIndex("sub_moc")),letras.at(i));
        else
            moc_model.setData(moc_model.index(0, moc_model.fieldIndex("sub_moc")),buffer.value("sub_moc").toString().append("-").append(letras.at(i)));
        moc_model.submitAll();
    }
}

QStringList mociones::lista_submociones(QString num_moc){
    QStringList buffer;
// Crea la conexion
    QSqlDatabase moc = QSqlDatabase::database("mociones",false);
    moc.setDatabaseName("mociones.db");
    moc.open();

// Crea el modelo
    QSqlTableModel moc_model(0,moc);
    moc_model.setTable("mociones");
    moc_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    moc_model.setFilter(QString("num_moc=").append(num_moc));
    moc_model.select();

    for(int i=0;i<moc_model.rowCount();i++){
        buffer << moc_model.record(i).value("sub_moc").toString();
    }
    return buffer;
}

void mociones::submocion(QString num_moc, QString sub_moc, QStringList &submocion){
// Crea la conexion
    QSqlDatabase moc = QSqlDatabase::database("mociones",false);
    moc.setDatabaseName("mociones.db");
    moc.open();

// Crea el modelo
    QSqlTableModel moc_model(0,moc);
    moc_model.setTable("mociones");
    moc_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    moc_model.setFilter(QString("num_moc=").append(num_moc).append(" and sub_moc='").append(sub_moc).append("'"));
    moc_model.select();

    submocion << "";
    submocion << moc_model.record(0).value("desc_moc").toString();
    submocion << moc_model.record(0).value("tipo_voto").toString();
    submocion << moc_model.record(0).value("opc1_desc").toString();
    submocion << moc_model.record(0).value("opc2_desc").toString();
    submocion << moc_model.record(0).value("opc3_desc").toString();
    submocion << moc_model.record(0).value("opc4_desc").toString();
    submocion << moc_model.record(0).value("opc5_desc").toString();
    submocion << moc_model.record(0).value("tipo_moc").toString();
}

bool mociones::isVoted(QString desc_moc){
// Manipulacion del string desc_prop para separar el numero de propuesta
    QString num_moc,sub_moc;
    int num_size,sub_size;

    desc_moc.remove(0,7);

    num_size = desc_moc.indexOf("-");
    sub_size = desc_moc.indexOf(":");

    if(num_size==-1 || num_size>sub_size){
        for(int j=0;j<sub_size; j++){
            num_moc.append(desc_moc.at(j));
        }
    }
    else if(num_size<sub_size){
            for(int j=0;j<num_size; j++){
                num_moc.append(desc_moc.at(j));
            }
            desc_moc.remove(0,num_size+1);
            sub_size = desc_moc.indexOf(":");
            for(int g=0;g<sub_size; g++){
                sub_moc.append(desc_moc.at(g));
            }
    }

// Crea la conexion
    QSqlDatabase moc = QSqlDatabase::database("mociones",false);
    moc.setDatabaseName("mociones.db");
    moc.open();

// Crea el modelo
    QSqlTableModel moc_model(0,moc);
    moc_model.setTable("mociones");
    moc_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    if(sub_moc.isEmpty())
        moc_model.setFilter(QString("num_moc= ").append(num_moc));
    else
        moc_model.setFilter(QString("num_moc= ").append(num_moc).append(" and sub_moc='").append(sub_moc).append("'"));
    moc_model.select();

    if(moc_model.record(0).value("voted").toString()=="no"){
        return false;}
    else if(moc_model.record(0).value("voted").toString()=="si"){
        return true;}
}

bool mociones::isVoted(QString num_moc, QString sub_moc){
// Crea la conexion
    QSqlDatabase moc = QSqlDatabase::database("mociones",false);
    moc.setDatabaseName("mociones.db");
    moc.open();

// Crea el modelo
    QSqlTableModel moc_model(0,moc);
    moc_model.setTable("mociones");
    moc_model.setEditStrategy(QSqlTableModel::OnManualSubmit);

    if(sub_moc.isEmpty())
        moc_model.setFilter(QString("num_moc= ").append(num_moc));
    else
        moc_model.setFilter(QString("num_moc= ").append(num_moc).append(" and sub_moc='").append(sub_moc).append("'"));
    moc_model.select();

    if(moc_model.record(0).value("voted").toString()=="no"){
        return false;}
    else if(moc_model.record(0).value("voted").toString()=="si"){
        return true;}
}

void mociones::set_Voted(QString desc_moc){
// Manipulacion del string desc_prop para separar el numero de propuesta
    QString num_moc,sub_moc;
    int num_size,sub_size;

    desc_moc.remove(0,7);

    num_size = desc_moc.indexOf("-");
    sub_size = desc_moc.indexOf(":");

    if(num_size==-1 || num_size>sub_size){
        for(int j=0;j<sub_size; j++){
            num_moc.append(desc_moc.at(j));
        }
    }
    else if(num_size<sub_size){
            for(int j=0;j<num_size; j++){
                num_moc.append(desc_moc.at(j));
            }
            desc_moc.remove(0,num_size+1);
            sub_size = desc_moc.indexOf(":");
            for(int g=0;g<sub_size; g++){
                sub_moc.append(desc_moc.at(g));
            }
    }

// Crea la conexion
    QSqlDatabase moc = QSqlDatabase::database("mociones",false);
    moc.setDatabaseName("mociones.db");
    moc.open();

// Crea el modelo
    QSqlTableModel moc_model(0,moc);
    moc_model.setTable("mociones");
    moc_model.setEditStrategy(QSqlTableModel::OnManualSubmit);
    if(sub_moc.isEmpty())
        moc_model.setFilter(QString("num_moc= ").append(num_moc));
    else
        moc_model.setFilter(QString("num_moc= ").append(num_moc).append(" and sub_moc='").append(sub_moc).append("'"));
    moc_model.select();

    moc_model.setData(moc_model.index(0, moc_model.fieldIndex("voted")), "si");
    moc_model.submitAll();
}
